# -*-coding:utf-8-*-
import numpy as np

"""
NumPy包中的二进制操作函数。
1.left_shift(x1,x2)/right_shift(x1,x2)：向左/右移位，参数类型[Number, ndarray, Iterable]
2.bitwise_and(x1,x2)：按位与，参数类型[Number, ndarray, Iterable]
3.bitwise_or(x1,x2)：按位或，参数类型[Number, ndarray, Iterable]
4.invert(x)：计算位非，对于有符号整数返回补码，参数类型[Number, ndarray, Iterable]
5.binary_reprnum(num:int,width)：返回给定宽度中十进制数的二进制字符串表示
# 1、2和3函数中的两个参数类型支持数组与数字的组合（前提是两个参数能够广播），如x1=[1 2 3],x2=1;x1=[1 2 3],x2=[1 1 1];x1=1,x2=[1,2,3]
# 1、2、3和4函数分别可以用<<、>>、&、|和~操作符代替
"""
# 移位
a = np.array([[1, 2, 3], [4, 5, 6]])
np.left_shift(5, 2)  # 20,5左移2位
np.left_shift(a, 1)  # [10 12 14],对a的元素都左移1位
np.left_shift(a, [1, 2, 3])  # [[2 8 24] [8 20 48]],对a的每列元素依次左移1、2、3位
np.left_shift(1, [1, 2, 3])  # [2 4 8],对1分别左移1、2、3位
np.right_shift(np.uint8(255), 1)  # 注意第二个参数的dtype能会更改结果的dtype.结果为510,type为intc
np.intc(5) << 2  # 使用操作符
# 按位与
np.bitwise_and(121, 34)  # 32（intc）
np.bitwise_and([22, 121], 43)  # [2 32]
np.intc(121) & 34  # 使用操作符
# 按位或
np.bitwise_or(121, 34)  # 123
np.intc(121) | 34  # 使用操作符
# 按位非
np.invert(np.uint8(12))  # 243（uint8）
np.invert(12)  # -13（intc）
np.invert(np.array([12, 13], dtype='i1'))  # [-13 -14]
x = ~np.array([12, 13], dtype='i1')  # 使用操作符
# 数字二进制字符串表示
np.binary_repr(12, 8)  # 00001100
